package com.dpwgc.demo.utils;

import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@Component
public class ZipUtils {

    /**
     * 压缩文件
     * @param zos       zip文件的输出流
     * @param file      需要压缩的文件或文件夹对象
     * @param filePath  压缩的文件路径
     * @param fileName  需要压缩的文件夹名
     * @param outPath   缩完成后保存为Test.zip文件
     */
    public boolean zip(ZipOutputStream zos, File file, String filePath, String fileName, String outPath){

        try{
            String path = file.getPath();
            String zosName = "";
            if(!StringUtils.isEmpty(path)){
                zosName = path.substring(path.indexOf(fileName));
            }
            File[] files = file.listFiles();
            if(file.isDirectory() && files != null && files.length > 0) {
                // 创建压缩文件的目录结构
                zos.putNextEntry(new ZipEntry(zosName + File.separator));
                for(File f : files) {
                    zip(zos, f, filePath, fileName, outPath);
                }
            } else {

                // 创建压缩文件
                zos.putNextEntry(new ZipEntry(zosName));
                // 用字节方式读取源文件
                InputStream is = new FileInputStream(file.getPath());
                // 创建一个缓存区
                BufferedInputStream bis = new BufferedInputStream(is);
                // 字节数组,每次读取1024个字节
                byte [] b = new byte[1024];
                // 循环读取，边读边写
                while(bis.read(b)!=-1) {
                    // 写入压缩文件
                    zos.write(b);
                }
                //关闭流
                bis.close();
                is.close();
            }

            return true;

        } catch (Exception e) {

            return false;
        }
    }
}
